# -*- coding: utf-8 -*-
################################################################################
#
# Copyright (c) 2014 Baidu.com, Inc. All Rights Reserved
#
################################################################################
"""
该模块用于实现抓取线程。

Authors: caopeirui(caopeirui@baidu.com)
Date:	2018/04/19 20:10:41
"""
import threading
import time
import webpage_parse as wp
from crawl_queue_manage import url_queue
from url_table import url_bloom_filter
from config_load import config_dict

def crawl_parse_save(name):
    '''爬取、解析、保存，用于之后传到线程函数里用。
    '''
    while True:
        try:
            # 若3s后还没有元素弹出，进入异常处理
            depth, url = url_queue.get(timeout=3)
        except Exception:
            # 若是此时队列还是空，才结束该线程函数
            # 大多数情况下，等待的那3s其他线程会向队列中推入元素
            # 所以，这样就克服了有些线程过早结束的问题
            if url_queue.empty():
                return
        else:
            print('线程', name, 'depth', depth, url)
            # url没有抓过才去抓
            if url_bloom_filter.test(url) == False: 
                href_list = wp.get_href(url)
            print('当前激活线程数：', threading.active_count())
            time.sleep(float(config_dict.get('crawl_interval')))    

            # 爬取深度到了配置限制就不保存该页面的超链了
            # 注意配置这里取到的是str，要转成int
            if depth >= int(config_dict.get('max_depth')):
                 continue

            if href_list:
                for _ in href_list:
                    # 超链没有爬过才放到url爬取队列
                    if url_bloom_filter.test(_) == False:
                        url_queue.put((depth + 1, _), block = False)
            